/////////////////////////////////////////////////////////////////////////////
// Copyright(c) 2012-2015 purang All Rights Reserved
// Name:        file_impl.h
// Purpose:     
// Author:      syy
// Modified by: 
// Created:     2014/1/3 15:26
// RCS-ID:      
// Licence:     
/////////////////////////////////////////////////////////////////////////////
#ifndef PR_SYSTEM_WRAPPERS_SOURCE_FILE_IMPL_H_
#define PR_SYSTEM_WRAPPERS_SOURCE_FILE_IMPL_H_

#include <stdio.h>

#include "file_wrapper.h"
#include "scoped_ptr.h"

namespace qb
{

	class RWLockWrapper;

	class FileWrapperImpl : public FileWrapper
	{
	public:
		FileWrapperImpl();
		virtual ~FileWrapperImpl();

		virtual int FileName(char* file_name_utf8,
			size_t size) const OVERRIDE;

		virtual bool Open() const OVERRIDE;

		virtual int OpenFile(const char* file_name_utf8,
			bool read_only,
			bool loop = false,
			bool text = false) OVERRIDE;

		virtual int CloseFile() OVERRIDE;
		virtual int SetMaxFileSize(size_t bytes) OVERRIDE;
		virtual int Flush() OVERRIDE;

		virtual int Read(void* buf, int length) OVERRIDE;
		virtual bool Write(const void* buf, int length) OVERRIDE;
		virtual int WriteText(const char* format, ...) OVERRIDE;
		virtual int Rewind() OVERRIDE;

	private:
		int CloseFileImpl();
		int FlushImpl();

		scoped_ptr<RWLockWrapper> rw_lock_;

		FILE* id_;
		bool open_;
		bool looping_;
		bool read_only_;
		size_t max_size_in_bytes_;  // -1 indicates file size limitation is off
		size_t size_in_bytes_;
		char file_name_utf8_[kMaxFileNameSize];
	};

}  // namespace qb

#endif  // PR_SYSTEM_WRAPPERS_SOURCE_FILE_IMPL_H_
